package org.xiaov.extra.mail;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.mail.MailProperties;
import org.springframework.stereotype.Component;
import org.xiaov.bean.mail.Mail;
import org.xiaov.bean.mail.MailType;
import org.xiaov.core.collection.ListHelper;
import org.xiaov.execption.XiaovMailException;
import org.xiaov.extra.mail.strategy.MailStrategy;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 操作邮件的帮助类
 * </p>
 *
 * @author xiaovcloud
 * @since 2021/2/26 12:29
 */
@Component
public class EmailHelper {
    private static final Logger log = LoggerFactory.getLogger(EmailHelper.class);
    private static String from;
    private static Map<String, MailStrategy> mailStrategy;

    @Resource
    public void setMailStrategy(Map<String, MailStrategy> mailStrategy) {
        EmailHelper.mailStrategy = mailStrategy;
    }

    @Resource
    private MailProperties mailProperties;

    @PostConstruct
    private void init() {
        EmailHelper.from = mailProperties.getUsername();
    }

    /**
     * 获取邮件
     *
     * @return 获取到的邮件
     */
    public static Mail getMail() {
        Mail mail = new Mail();
        mail.setFrom(from);
        return mail;
    }

    /**
     * 获取普通邮件和html邮件
     *
     * @param title       邮件标题
     * @param contentType 邮件类型
     * @param content     内容
     * @param to          邮件收件人
     * @return 获取到的邮件
     */
    public Mail getMail(String title,
                        MailType contentType,
                        String content,
                        String[] to) {
        Mail mail = getMail(title, contentType, to, null, null);
        mail.setContent(content);
        return mail;
    }

    /**
     * 获取模板邮件
     *
     * @param title        邮件标题
     * @param contentType  邮件类型
     * @param to           邮件收件人
     * @param templatePath 模板地址
     * @param params       模板参数
     * @return 获取到的邮件
     */
    public Mail getMail(String title,
                        MailType contentType,
                        String[] to,
                        String templatePath,
                        Map<String, Object> params) {
        Mail mail = getMail();
        mail.setTitle(title);
        mail.setContentType(contentType);
        mail.setTo(to);
        mail.setTemplatePath(templatePath);
        mail.setParams(params);
        return mail;
    }

    /**
     * 发送多人模板邮件
     *
     * @param contentType  邮件类型
     * @param title        邮件标题
     * @param to           邮件收件人
     * @param templatePath 模板地址
     * @param params       模板参数
     */
    public static void sendMail(MailType contentType,
                                String title,
                                List<String> to,
                                String templatePath,
                                Map<String, Object> params) {
        sendMail(contentType, title, null, to.toArray(new String[0]), templatePath, params);
    }

    /**
     * 发送单人模板邮件
     *
     * @param contentType  邮件类型
     * @param title        邮件标题
     * @param to           邮件收件人
     * @param templatePath 模板地址
     * @param params       模板参数
     */
    public static void sendMail(MailType contentType,
                                String title,
                                String to,
                                String templatePath,
                                Map<String, Object> params) {
        sendMail(contentType, title, ListHelper.newArrayList(to), templatePath, params);
    }


    /**
     * 重载 发送多人 普通邮件 和 html邮件
     *
     * @param contentType 邮件类型
     * @param title       邮件标题
     * @param content     内容
     * @param to          邮件收件人
     */
    public static void sendMail(MailType contentType,
                                String title,
                                String content,
                                List<String> to) {
        sendMail(contentType, title, content, to.toArray(new String[0]), null, null);
    }

    /**
     * 重载 发送单人 普通邮件 和 html邮件
     *
     * @param contentType 邮件类型
     * @param title       邮件标题
     * @param content     内容
     * @param to          邮件收件人
     */
    public static void sendMail(MailType contentType,
                                String title,
                                String content,
                                String to) {
        sendMail(contentType, title, content, ListHelper.newArrayList(to));
    }

    /**
     * 重载 发送邮件
     *
     * @param mail 邮件
     */
    public static void sendMail(Mail mail) {
        sendMail(mail.getContentType(),
                mail.getTitle(),
                mail.getContent(),
                mail.getTo(),
                mail.getTemplatePath(),
                mail.getParams());
    }

    /**
     * 发送邮件
     *
     * @param contentType  邮件类型
     * @param title        邮件标题
     * @param content      内容
     * @param to           邮件收件人
     * @param templatePath 模板地址
     * @param params       模板参数
     */
    public static void sendMail(MailType contentType,
                                String title,
                                String content,
                                String[] to,
                                String templatePath,
                                Map<String, Object> params) {
        Mail mail = getMail();
        mail.setContentType(contentType);
        mail.setTitle(title);
        mail.setContent(content);
        mail.setTo(to);
        mail.setTemplatePath(templatePath);
        mail.setParams(params);
        send(mail);
    }

    /**
     * 开始发送邮件
     */
    private static void send(Mail mail) {
        long start = System.currentTimeMillis();
        try {
            mailStrategy.get(mail.getContentType().getValue() + "Mail").sendMail(mail);
        } catch (Exception e) {
            throw new XiaovMailException("邮件发送失败", e);
        }
        long end = System.currentTimeMillis();
        log.info("发送邮件耗时：{}ms", end - start);
    }
}
